package com.lingfengerick.commons.connect;

import com.lingfengerick.commons.constant.NumberConstant;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.kernel.http.HTTPConstants;
import org.apache.axis2.rpc.client.RPCServiceClient;
import org.springframework.util.ObjectUtils;
import javax.xml.namespace.QName;

/**
 * @author lingfengerick
 * @since 2021/8/13 10:45 下午
 * webservice 工具类
 */
public class WebServiceUtils {

    /**
    * 使用Webservice方式调用
    * @author  lingfengerick
    * @since 2021/10/28  9:40 上午
    * @param url 请求地址
    * @param entryArgs 发送的信息
    * @param nameSpaceUrl 命名空间
    * @param methodName 方法名
    * @param nameSpaceUrl 命名空间
    * @param connectionTimeOut 连接超时时间
    * @param readTimeOut 读取超时时间
    * @return String 返回数据
    *
    */
    public static String callWebserviceSendMsg(String url , Object[] entryArgs , String nameSpaceUrl , String methodName ,
                                               Integer connectionTimeOut , Integer readTimeOut){
        Object resultObj;
        String resultStr = null;
        RPCServiceClient rpcServiceClient;
        try {
            rpcServiceClient = new RPCServiceClient();
            Options options = rpcServiceClient.getOptions();
            EndpointReference targetEpr = new EndpointReference(url);
            options.setTo(targetEpr);
            options.setManageSession(true);
            options.setProperty(HTTPConstants.CONNECTION_TIMEOUT , connectionTimeOut);
            options.setProperty(HTTPConstants.SO_TIMEOUT , readTimeOut);
            // 调用方法的参数值
            // 调用方法返回值的数据类型的Class对象
            @SuppressWarnings("rawtypes")
            Class[] classes = new Class[]{String.class};
            //调用方法名及WSDL文件的命名空间
            QName opName = new QName(nameSpaceUrl, methodName);
            resultObj = rpcServiceClient.invokeBlocking(opName, entryArgs, classes)[0];
            if (!ObjectUtils.isEmpty(resultObj)){
                resultStr = resultObj.toString();
            }
        } catch (AxisFault axisFault) {
            axisFault.printStackTrace();
        }
        return resultStr;
    }
    /**
    * 默认超时时间的调用方式
    * @author  lingfengerick
    * @since 2021/10/28  7:27 下午
    * @param url 请求地址
    * @param entryArgs 发送的信息
    * @param nameSpaceUrl 命名空间
    * @param methodName 方法名
    * @return String 返回结果
    *
    */
    public String callWebservice(String url , Object[] entryArgs , String nameSpaceUrl , String methodName){
        return callWebserviceSendMsg(url , entryArgs , nameSpaceUrl , methodName , NumberConstant.NUM_INT_2000 , NumberConstant.NUM_INT_5000);
    }
}
